package cn.autumnorange.app.common.consumer.rpc.header.wrapper;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * HttpServletRequestWrapper不提供request的写入header头信息
 * 这里重写HttpServletRequestWrapper 将header头信息放入自定义headerMap中
 *
 * @author wsf
 * @version V1.0 1、request克隆 2、提供增加header里面放置对象的方法 @ClassName: @Description:
 * @date 2018/6/26 14:03
 */
public class HttpServletRequestRPCWrapper extends HttpServletRequestWrapper implements HeaderService {
    private final Map<String, String> headerMap;

    public HttpServletRequestRPCWrapper(HttpServletRequest request) throws IOException {
        super(request);
        headerMap = new HashMap<String, String>();
        // 提取本次请求原本的header内容存储在headerMap
        Enumeration enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String name = (String) enumeration.nextElement();
//            headerMap.put(name, request.getHeader(name));
            setHeader(name,request.getHeader(name));
        }
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

    @Override
    public String setHeader(String name, String value) {
        //header key zuul网关首字母以及-后字母都是大写,有可能传入首字母大写的情况,headerMap key都是小写 ,所以需要转首字母大写
        name=changePrefixUpperCase(name);
        String headerValue= headerMap.put(name,value);
        return headerValue;
    }

    @Override
    public String removeHeader(String name) {
        String headerValue=null;
//        if(StringUtils.isNotEmpty(name)){
//            headerValue= headerMap.remove(name);
//            if(headerValue==null){
//                //header key 有可能传入首字母大写的情况,headerMap key都是小写 ,所以需要转小写
//                headerValue= headerMap.remove(name.toLowerCase());
//            }
//        }
//        return headerValue;

        //header key zuul网关首字母以及-后字母都是大写,有可能传入首字母大写的情况,headerMap key都是小写 ,所以需要转首字母大写
        name=changePrefixUpperCase(name);
        headerValue= headerMap.remove(name);
        return headerValue;
    }

    @Override
    public String getHeader(String name) {
        String headerValue=null;
//        if(StringUtils.isNotEmpty(name)){
//            headerValue= headerMap.get(name);
//            if(headerValue==null){
//                //header key 有可能传入首字母大写的情况,headerMap key都是小写 ,所以需要转小写
//                headerValue= headerMap.get(name.toLowerCase());
//            }
//        }
//        return headerValue;
        name=changePrefixUpperCase(name);
        headerValue= headerMap.get(name);
        return headerValue;

    }

    @Override
    public Enumeration getHeaderNames() {
        Set<String> set = new HashSet<String>(headerMap.keySet());
        //    重复在set集合加值
        //    Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
        //    while (e.hasMoreElements()) {
        //      String n = e.nextElement();
        //      set.add(n);
        //    }
        // create an enumeration from the set and return
        return Collections.enumeration(set);
    }
//    转首字母 工具类方法 通用的工具应该做成全局调用api
public static String changePrefixUpperCase(String name){
    String[] nameSplit= name.split("-");
    String namePrefixUpperCase="";
    for(int i=0;i<nameSplit.length;i++){
        String prefox=nameSplit[i].substring(0,1);
        String prefixUpCase=prefox.toUpperCase();
        namePrefixUpperCase+=nameSplit[i].replaceFirst(prefox,prefixUpCase);
        if(i!=nameSplit.length-1){
            namePrefixUpperCase+="-";
        }
    }
    System.out.println(namePrefixUpperCase);
    return namePrefixUpperCase;

}
}
